package com.zhj.rabbitmq.demo3;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @program: rabbimmq-demo
 * @description: 交换机fanout模式，消息接收 01
 *              由于是广播模式，所以先启动消费者
 * @author: zhengjibin
 * @create: 2020-11-17 09:45
 * @Version 1.0
 **/
public class ExchangeFanoutReceiveMessage01 {
    public static void main(String[] args) throws IOException, TimeoutException {
        ConnectionFactory factory = new ConnectionFactory();
        //配置rabbitmq的链接信息
        factory.setHost("122.112.198.94");
        factory.setPort(5672);
        factory.setUsername("admin");
        factory.setPassword("admin");
        Connection connection = null;// 定义rabbitmq的网络连接 ，一个连接
        Channel channel = null;//定义一个链接中的通道
        connection = factory.newConnection();//通过工厂获得连接
        channel = connection.createChannel();//通过连接获得通道

        String exchangeName = "fanout_exchange";

        /*
            由于 我们的交换机时fanout 类型的。是一种广播模式，那绑定到交换机上的队列会很多
            所以我们不好直接指定队列名称，所以通过随机队列来创建
            queueDeclare()方法不传参数，生成的队列不持久化（没有消费者绑定就会删除），是排外的队列只能一个消费者监听
            getQueue();获取生成的随机队列名称
         */
        String queueName = channel.queueDeclare().getQueue();
        channel.exchangeDeclare(exchangeName,"fanout",true);
        //随机队列绑定到 fanout 类型交换机 不需要指定routingkey(bindingkey) 进行绑定
        channel.queueBind(queueName,exchangeName,"");

        channel.basicConsume(queueName,true,"",new DefaultConsumer(channel){
            //重写 DefaultConsumer 中的方法
            /*
                参数1：消息标签
                参数2：消息对象
                参数3：消息属性信息
                参数4：消息具体内容
                注意：DefaultConsumer 方法使用后，会启动一个线程，异步的持续监听消息队列，如果队列中有消息会自动接收
                    所以不能关闭channel和connection 对象
             */
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                //super.handleDelivery(consumerTag, envelope, properties, body);
                String message = new String(body,"UTF-8");
                System.out.println("消费者01："+message);
            }
        });
    }
}
